/*
    对二次封装库elastic_search测试
*/
#include "elastic_search.hpp"
#include <gflags/gflags.h>

DEFINE_bool(run_mode, false, "程序的运行模式，false-调试； true-发布；");
DEFINE_string(log_file, "", "发布模式下，用于指定日志的输出文件");
DEFINE_int32(log_level, 0, "发布模式下，用于指定日志输出等级");

int main(int argc, char* argv[])
{
    // 解析命令行参数
    google::ParseCommandLineFlags(&argc, &argv, true);

    // 初始化日志记录器
    ns_spdlogger::init_logger(FLAGS_run_mode, FLAGS_log_level, FLAGS_log_file);

    // 1、创建客户端
    std::shared_ptr<elasticlient::Client> client(new elasticlient::Client({"http://127.0.0.1:9200/"}));

    // 2、构建索引
    ESIndex index(client, "user"); // 定义构建索引对象
    index.append("nickname"); // 设置昵称字段 && 属性
    index.append("phone", "keyword", "standard", true); // 设置手机号字段 && 属性
    bool ret = index.create(); // 发起构建索引请求
    if(ret == true)
        LOG_DEBUG("创建索引成功");

    // 3、新增数据（单挑新增：一次新增一个文档）
    ESInsert ist(client, "user");
    // 3.1 新增第一条数据
    ist.append("nickname", "zhangsan") // 如果只指定一个字段数据，则没有指定的是空
        .append("phone", "2000000000");
    ret = ist.insert("01");
    if(ret == true)
        LOG_DEBUG("新增数据成功");

    // 3.2 新增第二条数据
    ist.append("nickname", "zhangsan")
        .append("phone", "1000000000");
    ret = ist.insert("02");
    if(ret == true)
        LOG_DEBUG("新增数据成功");

    // // 4、修改数据（如果在索引名相同，文档类型相同，文档id相同，那么此时新增数据操作就变成了修改数据）
    // ist.append("nickname", "lisi")
    //     .append("phone", "12000000000");
    // ret = ist.insert("01");
    // if(ret == true)
    //     LOG_DEBUG("修改数据成功");

    // 5、检索数据
    ESSearch srh(client, "user");
    srh.append_should("nickname", "zhangsan") // 搜索时即使匹配条件只指定一个字段，也会将整个文档检索下来，类似数据库的检索
        .append_must_not("phone.keyword", {"1000000000"}); // keyword标识搜索时候对phone字段不分词
    Json::Value result = srh.search();
    if(result.empty() || !result.isArray())
        LOG_ERROR("检索结果为空或者结果不是数组");
    else
    {
        int sz = result.size();
        LOG_DEBUG("检索数据成功：总共数据：{}", sz);
        for(int i = 0; i < sz; i++)
        {
            LOG_DEBUG("nickname: {}", result[i]["_source"]["nickname"].asString());
            LOG_DEBUG("phone: {}", result[i]["_source"]["phone"].asString());
        }
    }

    // // 6、删除数据
    ESRemove rmv(client, "user");
    ret = rmv.remove("01"); //测试指定id和不指定id
    if(ret == true)
        LOG_ERROR("删除数据成功");

    return 0;
}